// 导入Dart核心库
import 'dart:io'; // 输入输出操作库

// 定义一个表示宇宙飞船的类
class Spacecraft {
  String name; // 飞船名称
  DateTime? launchDate; // 发射日期，可为null

  // 计算属性：获取发射年份（只读）
  int? get launchYear => launchDate?.year;

  // 主构造函数，使用语法糖简化成员赋值
  Spacecraft(this.name, this.launchDate) {
    // 这里可以放置初始化代码
  }

  // 命名构造函数：创建未发射的飞船
  Spacecraft.unlaunched(String name) : this(name, null);

  // 描述飞船信息的方法
  void describe() {
    print('飞船名称: $name');
    // 局部变量用于类型提升
    var launchDate = this.launchDate;
    if (launchDate != null) {
      // 计算发射至今的年数
      int years = DateTime.now().difference(launchDate).inDays ~/ 365;
      print('发射年份: $launchYear ($years 年前)');
    } else {
      print('尚未发射');
    }
  }
}

// 定义行星类型的枚举
enum PlanetType { terrestrial, gas, ice }

// 增强型枚举：带有属性和方法的枚举
enum Planet {
  // 枚举值及其属性
  mercury(planetType: PlanetType.terrestrial, moons: 0, hasRings: false),
  venus(planetType: PlanetType.terrestrial, moons: 0, hasRings: false),
  earth(planetType: PlanetType.terrestrial, moons: 1, hasRings: false),
  mars(planetType: PlanetType.terrestrial, moons: 2, hasRings: false),
  jupiter(planetType: PlanetType.gas, moons: 79, hasRings: true),
  saturn(planetType: PlanetType.gas, moons: 82, hasRings: true),
  uranus(planetType: PlanetType.ice, moons: 27, hasRings: true),
  neptune(planetType: PlanetType.ice, moons: 14, hasRings: true);

  // 枚举构造函数
  const Planet({
    required this.planetType,
    required this.moons,
    required this.hasRings,
  });

  // 枚举属性
  final PlanetType planetType;
  final int moons;
  final bool hasRings;

  // 计算属性：判断是否为巨型行星
  bool get isGiant =>
      planetType == PlanetType.gas || planetType == PlanetType.ice;
}

// Mixin：为类添加飞行员相关功能
mixin Piloted {
  int astronauts = 1; // 宇航员数量

  void describeCrew() {
    print('宇航员人数: $astronauts');
  }
}

// 使用Mixin的飞船类
class PilotedCraft extends Spacecraft with Piloted {
  double altitude; // 飞行高度

  PilotedCraft(super.name, super.launchDate, this.altitude);
}

// 轨道飞行器类
class Orbiter extends Spacecraft {
  double altitude; // 轨道高度

  Orbiter(super.name, super.launchDate, this.altitude);
}

// 抽象类：可描述的对象
abstract class Describable {
  void describe(); // 抽象方法

  // 具体方法：带强调的描述
  void describeWithEmphasis() {
    print('=========');
    describe();
    print('=========');
  }
}

// 实现抽象类的具体类
class MyDescribable extends Describable {
  @override
  void describe() {
    print("This is a description.");
  }
}

// 程序入口：main函数
void main() {
  print('你好，世界！');

  // 变量声明与初始化
  var name = '旅行者1号';
  var year = 1977;
  var antennaDiameter = 3.7;
  var flybyObjects = ['木星', '土星', '天王星', '海王星'];
  var image = {
    'tags': ['土星'],
    'url': '//path/to/saturn.jpg',
  };

  // 打印变量值
  print('名称: $name');
  print('年份: $year');
  print('天线直径: $antennaDiameter');
  print('飞掠过的天体: $flybyObjects');
  print('图像信息: $image');

  // 条件语句示例
  if (year >= 2001) {
    print('21世纪');
  } else if (year >= 1901) {
    print('20世纪');
  }

  // 循环语句示例
  // for-in循环
  for (final object in flybyObjects) {
    print(object);
  }

  // 传统for循环
  for (int month = 1; month <= 12; month++) {
    print(month);
  }

  // while循环
  while (year < 2016) {
    year += 1;
  }
  print('循环后的年份: $year');

  // 函数定义与使用：计算斐波那契数列
  int fibonacci(int n) {
    if (n == 0 || n == 1) return n;
    return fibonacci(n - 1) + fibonacci(n - 2);
  }

  var result = fibonacci(20);
  print('斐波那契数列第20项: $result');

  // 高阶函数示例：过滤并打印
  flybyObjects.where((name) => name.contains('turn')).forEach(print);

  // 类实例化与使用
  var voyager = Spacecraft('旅行者1号', DateTime(1977, 9, 5));
  voyager.describe();

  var voyager3 = Spacecraft.unlaunched('旅行者3号');
  voyager3.describe();

  // 继承类的使用
  var orbiter = Orbiter("轨道飞行器1号", DateTime(2020, 1, 1), 1000.0);
  orbiter.describe();
  print("轨道飞行器高度: ${orbiter.altitude}");

  // 枚举的使用
  final yourPlanet = Planet.earth;
  if (!yourPlanet.isGiant) {
    print('你的行星不是一个 "巨型行星".');
  }
  print('你的行星是: ${yourPlanet.name}');
  print('行星类型: ${yourPlanet.planetType}');
  print('卫星数量: ${yourPlanet.moons}');
  print('是否有环: ${yourPlanet.hasRings}');

  // 异步编程示例
  Future<void> printWithDelay(String message) async {
    await Future.delayed(Duration(seconds: 1)); // 延迟1秒
    print(message);
  }

  printWithDelay('你好，异步世界！');

  // 异步文件操作模拟
  Future<void> createDescriptions(Iterable<String> objects) async {
    for (final object in objects) {
      try {
        print('创建 $object 描述文件.');
        await Future.delayed(Duration(milliseconds: 100));
      } on IOException catch (e) {
        print('无法创建 $object 的描述: $e');
      } finally {
        print('$object 的描述处理完成');
      }
    }
  }

  createDescriptions(flybyObjects);

  // 异步生成器示例
  Stream<String> report(Spacecraft craft, Iterable<String> objects) async* {
    for (final object in objects) {
      await Future.delayed(Duration(seconds: 1));
      yield '${craft.name} 飞过 $object'; // 生成流数据
    }
  }

  report(voyager, flybyObjects).forEach(print);

  // 异常处理示例
  try {
    print('一切正常，宇航员数量正常');
  } catch (e) {
    print('捕获到异常: $e');
  }

  // 抽象类的使用
  MyDescribable myDescribable = MyDescribable();
  myDescribable.describeWithEmphasis();
}
